package com.mall.cart.server.service.impl;


import com.mall.cart.server.mapper.CartItemMapper;
import com.mall.cart.server.service.ICartItemService;
import com.mall.cart.server.vo.CartItemVo;
import com.mall.cart.server.vo.CartRequest;
import com.mall.cart.server.vo.CartVo;
import com.mall.common.core.text.Convert;
import com.mall.common.redis.service.RedisService;
import com.mall.common.security.utils.SecurityUtils;
import com.mall.system.common.model.LoginUser;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * shoppingService业务层处理
 *
 * @author ruoyi
 * @date 2024-12-27
 */
@Service
public class CartItemServiceImpl implements ICartItemService {

    @Resource
    private RedisService redisService;
    @Resource
    private CartItemMapper cartItemMapper;

    private final String CART_KEY = "q_cart:";

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 添加购物车
     *
     * @param cartRequest
     */
    @Override
    public void addCartItem(CartRequest cartRequest) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (loginUser == null) {
            // 这里可以抛出一个合适的异常或者返回错误提示
            throw new RuntimeException("用户未登录");
        }

//        LoginUser loginUser = new LoginUser();
//        loginUser.setUserid(loginUser.getUserid());

        String key = CART_KEY+loginUser.getUserid();


        CartVo cartVo = cartItemMapper.selectskuIdCartVo(cartRequest.getSkuId());
        if (cartVo == null) {
            // 这里可以抛出一个异常或者处理空购物车的情况
            throw new RuntimeException("购物车信息为空");
        }

        String skuAttr = cartItemMapper.selectCartVoAttr(cartRequest.getSkuId());



        cartVo.setUserId(loginUser.getUserid());

        List<CartVo> carts = cartItemMapper.selectCart();

        //卖家是否存在
        cartIsExist(carts,cartVo);

        //购物车商品信息
        cartVo.getCartItemVoList().forEach(cartItemVo -> {
            cartItemVo.setCartId(cartVo.getId());

            cartItemVo.setSkuId(cartRequest.getSkuId());

            cartItemVo.setSkuAttr(skuAttr);

            cartItemVo.setCartItemChecked(1);

            cartItemVo.setCartItemNum(cartRequest.getNum());
        });


        // 遍历并更新或插入 Redis 中的购物车项
        cartVo.getCartItemVoList().forEach(cartItemVo -> {

            //判断购物车是否存在
            if(!redisService.hasKey(key)){
                redisService.setCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()), cartItemVo);

                return;
            }

            if (redisService.hasKey(key)){

                CartItemVo newCartItemVo = (CartItemVo) redisService.getCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()));

                //判断商品是否已存在
                if(newCartItemVo == null){
                    redisService.setCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()), cartItemVo);

                    return;
                }
                // 如果 Redis 中已有该商品，更新商品数量
                if(newCartItemVo != null){
                    newCartItemVo.setCartItemNum(newCartItemVo.getCartItemNum() + cartItemVo.getCartItemNum());

                    redisService.setCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()), newCartItemVo);
                }
            }
        });

    }

    @Override
    public void deleteCartItem(String skuIds) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        String key = CART_KEY + loginUser.getUserid();
        //分割删除的skuId
        String[] skuIdList = Convert.toStrArray(skuIds);
        for (String skuId : skuIdList) {
            redisService.deleteCacheMapValue(key, String.valueOf(skuId));
        }

    }
    @Override
    public List<CartItemVo> cartVoList() {
       /* LoginUser loginUser = SecurityUtils.getLoginUser();

        String key = CART_KEY+loginUser.getUserid();

        Map<String, CartItemVo> map = redisService.getCacheMap(key);

        List<CartVo> cartVos = new ArrayList<>();

        CartVo cartVo = new CartVo();

        List<CartItemVo> cartItemVoList = new ArrayList<>();

        map.forEach((k, v) -> {

            CartItemVo cartItemVo = new CartItemVo();

            BeanUtils.copyProperties(v, cartItemVo);

            cartItemVoList.add(cartItemVo);

            Long cartId = v.getCartId();

            CartVo newCartVo = cartItemMapper.selectCartId(cartId);

            BeanUtils.copyProperties(newCartVo, cartVo);

        });

        cartVos.add(cartVo);

        cartVo.setCartItemVoList(cartItemVoList);*/

        List<CartItemVo> cartItemVos = cartItemMapper.selectCartItem();

        return cartItemVos;
    }


    /**
     * 卖家是否存在
     */
    private void cartIsExist(List<CartVo> carts, CartVo cartVo) {
        if (carts.size() == 0){
            cartItemMapper.addCart(cartVo);
            return;
        }

        carts.forEach(cart -> {


            if(!cart.getUserId().equals(cartVo.getUserId())){
                if(!cart.getSellerId().equals(cartVo.getSellerId())){
                    cartItemMapper.addCart(cartVo);
                }
            }
            cartVo.setId(cart.getId());
        });
    }
}
